import requests
from bs4 import BeautifulSoup
import matplotlib.pyplot as plt
from collections import defaultdict

# 设置支持中文的字体
plt.rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题

# --------- 爬虫部分（已提供） ---------
def get_douban_top250_movie_names():
    url = "https://movie.douban.com/top250"
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
    }
    movie_names = []
    for i in range(0, 250, 25):
        params = {'start': i}
        response = requests.get(url, headers=headers, params=params)
        soup = BeautifulSoup(response.text, 'lxml')
        divs = soup.find_all('div', class_='hd')
        for div in divs:
            a = div.find('a')
            span = a.find('span', class_='title')
            movie_names.append(span.text)
    return movie_names

# --------- 数据分析部分（新增） ---------
import matplotlib.pyplot as plt
from collections import defaultdict

# 获取电影名称列表
movies = get_douban_top250_movie_names()

# 定义函数：提取中文的首字母拼音
def get_first_letter(name):
    from pypinyin import pinyin, Style
    # 提取第一个中文字的首字母（大写）
    if not name:  # 空检查
        return 'Unknown'
    first_char = name[0]
    if not '\u4e00' <= first_char <= '\u9fff':  # 如果不是中文，直接取原字符
        return first_char.upper()
    else:
        return pinyin(first_char, style=Style.FIRST_LETTER)[0][0].upper()

# 统计每个首字母的出现次数
letter_counts = defaultdict(int)
for name in movies:
    letter = get_first_letter(name)
    letter_counts[letter] += 1

# 按字母顺序排序
sorted_letters = sorted(letter_counts.items(), key=lambda x: ord(x[0]))

# --------- 可视化结果 ---------
labels = [item[0] for item in sorted_letters]
values = [item[1] for item in sorted_letters]

plt.figure(figsize=(12,6))
plt.bar(labels, values, color='#66b3ff', edgecolor='black')
plt.title('豆瓣Top250电影首字母分布', fontsize=14)
plt.xlabel('首字母', fontsize=12)
plt.ylabel('电影数量', fontsize=12)
plt.grid(axis='y', alpha=0.5)
plt.show()
